package com.lagou.homework.threadiocopydemo;

import java.io.*;

/**
 * @author Rentaian
 */
public class ThreadPoolCopy implements Runnable {
    @Override
    public void run() {
        File sourceFile = new File("d:\\copyFiles");
        File toFile = new File("d:\\toFiles");
        ThreadPoolCopy tpc = new ThreadPoolCopy();
        tpc.copyDirectory(sourceFile,toFile);
    }

    /**
     * 此方法用于拷贝目录和文件
     * @param sourcefile
     * @param toFile
     */
    public void copyDirectory(File sourcefile,File toFile) {
        //判断它是否为可读，可读的话就进行操作
        if(sourcefile.canRead()) {
            //判断是否为文件夹/目录,是的话则创建目录
            if(sourcefile.isDirectory()) {
                toFile.mkdirs();
                System.out.println("开始复制 " + sourcefile.getAbsolutePath() + "中的文件夹和文件到 " + toFile.getAbsolutePath());
                //然后获取目录下的子目录子文件
                File[] files = sourcefile.listFiles();
                //遍历目录下的文件,如果是文件则调用复制文件方法，复制，是目录则递归调用
                for(File ff : files) {
                    if(ff.isFile()) {
                        copyFiles(ff,new File(toFile.getAbsolutePath()+File.separator+ff.getName()));
                        System.out.println("正在复制文件：" + ff.getAbsolutePath());
                    }else if(ff.isDirectory()) {
                        copyDirectory(ff,new File(toFile.getAbsolutePath()+File.separator+ff.getName()));
                        System.out.println("正在复制文件夹： " + ff.getAbsolutePath());
                    }
                }
            }
        } else {
            System.out.println("源文件夹 " + sourcefile.getAbsolutePath() + " 不可读，所以不可复制！");
        }

    }

    /**
     * 此方法专门用于拷贝文件
     * @param file
     * @param toFile
     */
    public void copyFiles(File file,File toFile) {
        //声明输入输出流用于复制
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            //创建对象,用于进行复制
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            fos = new FileOutputStream(toFile);
            bos = new BufferedOutputStream(fos);
            //根据读入的文件进行写入
            int len = 0;
            while((len = bis.read()) != -1) {
                bos.write(len);
            }
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关流操作
            if(bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != fos) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != fis) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
